package org.csu.softwaremetrics_demo.metric.ck;

/**
 * NOPF（Number of Public Fields）度量类
 * 用于计算类中公共字段（public修饰的成员变量）的数量
 * 继承自AST访问器，实现了Metric接口
 */

import org.csu.softwaremetrics_demo.entity.common.CKMetricSingleClass;
import org.csu.softwaremetrics_demo.entity.result.Result;
import org.csu.softwaremetrics_demo.metric.Metric;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.Modifier;

public class NOPF extends ASTVisitor implements Metric<CKMetricSingleClass> {

    /**
     * 存储公共字段计数的字段
     */
    private int fields;

    /**
     * 访问字段声明节点
     * 只计算被public修饰符修饰的字段
     * @param node 字段声明节点
     * @return false 表示不需要访问子节点
     */
    @Override
    public boolean visit(FieldDeclaration node) {
        if(Modifier.isPublic(node.getModifiers()))
            fields++;
        return false;
    }

    /**
     * 执行NOPF度量计算
     * @param cu 编译单元
     * @param singleMetric 存储度量结果的对象
     * @param result 包含所有度量结果的报告
     */
    @Override
    public void execute(CompilationUnit cu, CKMetricSingleClass singleMetric, Result result) {
        cu.accept(this);
    }

    /**
     * 设置NOPF度量结果
     * @param singleMetric 要设置结果的度量对象
     */
    @Override
    public void setSingleMetric(CKMetricSingleClass singleMetric) {
        singleMetric.setNopf(fields);
    }
}
